package br.com.saeng2D.objeto.forca;

import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.geom.Arc2D;
import java.io.PrintWriter;

import br.com.saeng2D.objeto.AbstratoObjeto;
import br.com.saeng2D.objeto.animado.VetorAnimado;
import br.com.saeng2D.util.R2D;
import br.com.saeng2D.util.Util;

public class ForcaMomento extends AbstratoForca {
	private int diametro;
	private int raio;
	
	public ForcaMomento(int x, int y) {
		super("forca_momento", x, y);
		setSentidoPosOuNeg(true);
		setOrientacao(true);
		inicializacao();
		this.corFundo = Util.getCor("cor_forca_momento");
		this.raio = Util.getInt("raio_forca_momento");
		diametro = raio * 2;
	}

	public void alterarTamanho(int tamanho) {
		raio = tamanho;
		diametro = raio * 2;
	}
	
	public void inicializacao() {
		vetores = new VetorAnimado[1];
		vetores[0] = new VetorAnimado( 5000,  5000,  false, false);
		
		vetorReferencia = vetores[0];
	}

	public void reassociar() {
		vetorReferencia = vetores[0];
	}
	
	public void rotacionar(int grau) {
//		super.rotacionar(grau);
//		this.grau = grau;
	}
	
	public AbstratoObjeto prototipo() {
		ForcaMomento forca = new ForcaMomento(x, y);
		forca.raio = raio;
		forca.diametro = diametro;
		forca.vetores = vetores;
		forca.associacoes = associacoes;
		forca.vetorReferencia = vetorReferencia;
		forca.variavelForca = variavelForca;
		return forca;
	}
	
	public void salvarXML(String prefixo, PrintWriter pw) {
//		pw.print(prefixo + "\t<" + descricao + " x=\"" + x + "\" y=\"" + y + "\" q=\"" + vetores.length + "\" vetores=\"" + vetores() + "\" grau=\"" + grau + "\" stringValorNewton=\"" + stringValorNewton + "\"/>\r\n");
	}
	
	public final void restaurar(int q, String stringVetores, int grau, String stringValorNewton) {
//		vetores = new VetorAnimado[q];
//		String[] strings = stringVetores.split("@");
//		int i = 0;
//		for(String s : strings) {
//			String[] sv = s.split(";");
//			float x = Float.parseFloat(sv[0]);
//			float y = Float.parseFloat(sv[1]);
//			boolean visivel = Boolean.parseBoolean(sv[2]);
//			boolean referencia = Boolean.parseBoolean(sv[3]);
//			vetores[i] = new VetorAnimado(x, y, visivel, referencia);
//			i++;
//		}
//		reassociar();
//		this.grau = grau;
//		this.stringValorNewton = stringValorNewton;
	}
	
	public void desenhar(Graphics2D g2) {
		if(!isVisivel()) {
			return;
		}
		g2.setStroke(AbstratoObjeto.LARGURA_LINHA_ABSTRATO_OBJETO);
		if (selecionado) {
			g2.setColor(corSelecionado);
		} else {
			g2.setColor(corFundo);
		}
		Polygon polygon = new Polygon();
		if(retornaSentido()) {
			polygon.translate(x, y - raio - 3);
			polygon.addPoint(x, y - raio + 3);
			polygon.addPoint(x+9, y - raio);
			polygon.addPoint(x, y - raio - 3);
			g2.fill(polygon);
			g2.draw(new Arc2D.Float(x-raio, y-raio, diametro, diametro, 90, 270, Arc2D.OPEN));
		} else {
			polygon.translate(x, y - raio - 3);
			polygon.addPoint(x, y - raio + 3);
			polygon.addPoint(x-9, y - raio);
			polygon.addPoint(x, y - raio - 3);
			g2.fill(polygon);
			g2.draw(new Arc2D.Float(x-raio, y-raio, diametro, diametro,180, 270, Arc2D.OPEN));
		}
//		int x = (int) vetores[4].x;
//		int y = (int) vetores[4].y;
//		int dx = grau == 180 ? 10 : 0; 
//		int dy = grau == 270 ? -10 : 0; 
//		g2.drawString(stringValorNewton, this.x + x + dx, this.y + y * -1 + dy);
		if(variavelForca != null) {
			g2.setColor(corVariavelForca);
			g2.drawString(variavelForca, x - 7, y + 22);
		}
	}

	public final R2D getArea() {
		R2D r2d = new R2D(x-raio, y-raio, diametro, diametro);
		return r2d;
	}
	
	public boolean estarSob(int x, int y) {
		return getArea().contem(x, y);	
	}

	public boolean ehIgual(AbstratoObjeto objeto) {
		// TODO implementar
		return false;
	}

	
	private class Memento {
		private ForcaMomento forca;
		private String variavelForca;

		public Memento(ForcaMomento forca) {
			this.forca = forca;
			variavelForca = forca.variavelForca;
		}
		
		public void restaurar() {
			forca.variavelForca = variavelForca;
		}
	}
	
	public void restaurarMemento() {
		if(memento != null) {
			memento.restaurar();
		}
	}
	
	public void criarMemento() {
		memento = new Memento(this);
	}
	
	private Memento memento;
}